/*
*@filename:
*@desc:以下函数，应该在snake_move()的时候调用，当蛇头改变位置的时候
*/

#include <list>
#include "snake_define.h"
#include "rules.h"

extern std::list<Snake> snake_list;

/*
*@func:规则1：撞墙规则————检查当前蛇是否撞墙，并设置相关的状态
*@desc:墙的坐标：假设在边界（x=0, y=0, x=39, y=39 位置）
*@param:Snake &snake
*/
void Snake::check_hit_wall()
{
    SnakeNode &head = get_snake_head();
    if(head.x == 0 || head.x == 39)
    {
        set_user_stat(GAME_OVER);
        return;
    }
    if(head.y == 0 || head.y == 39)
    {
        set_user_stat(GAME_OVER);
        return;
    }
}

/*
*@func:规则2：互斥规则————检查当前蛇是否与其他蛇相撞，并设置相关的状态
*@desc:推论：假设蛇相撞只会当前蛇的蛇头与其他蛇的头身相撞、而不存在当前蛇身相撞的情况
*@param:Snake &snake
*/
void Snake::check_hit_other()
{
    SnakeNode &head = get_snake_head();
    int head_x = head.x;
    int head_y = head.y;

    //对于snake_list的其他蛇
    for(Snake &snake:snake_list)
    {
        //跳过不是本身的蛇
        if(snake == *this)
        {
            continue;
        }
        else//其他蛇（其他蛇的所有坐标检查一遍）
        {
            auto snake_body =snake.get_snake_total();
            for(auto siter=snake_body.begin(); siter!=snake_body.end(); siter++)
            {
                if(head_x == siter->x && head_y == siter->y)
                {
                    //撞到其他蛇，游戏结束
                    snake.set_user_stat(GAME_OVER);
                    //snake_list.remove(*this);
                    //snake_die();
                    return;
                } 
            }
        }
    }
}


/*
*@func:规则3：自斥规则————检查当前蛇是否与自身
*@desc:推论：假设蛇头只与蛇身相撞、而不存在当前蛇身相撞的情况
*@param:Snake &snake
*/
void Snake::check_hit_self()
{
    SnakeNode &head = get_snake_head();
    int head_x = head.x;
    int head_y = head.y;
    
    auto snake_body = get_snake_total();
    //除蛇头外
    for(auto siter = snake_body.begin()+1; siter!=snake_body.end(); siter++)
    {
        if((siter->x == head_x)&&(siter->y)==head_y)
        {
            set_user_stat(GAME_OVER);
            //游戏没必要进行下去
            //snake_list.remove(*this);
            //snake_die();
            return;
        }
    }
}